
https://labuladong.online/algo/data-structure-basic/binary-tree-basic/
今天是學習的第 19 天,主要學習了二叉樹基礎及常見類型:
二叉樹是最重要的基本資料結構,很多複雜的資料結構都是建立在二叉樹的基礎上。所以把二叉樹搞懂了,後面學其他東西會輕鬆很多。

4 就是節點 2 的子節點),上面那個就叫父節點(節點 2 是節點 4 的父節點)。5 和 7 這一塊,就是節點 3 的左子樹)。1 叫做根節點,最下面沒有子節點的節點 4、7、8 叫做葉子節點。4。滿二叉樹就是每一層節點都是滿的,整棵樹就像一個三角形:

有個小技巧:如果滿二叉樹的深度是 h,節點總數就是 2^h - 1。所以上面這棵深度 4 的樹,節點數就是 2^4-1=15 個。
完全二叉樹的規則是:每一層的節點都要靠左排列,而且除了最後一層,其他層都必須是滿的:

二叉搜索樹有個簡單的口訣:「左小右大」
意思就是說,對於每個節點:

高度平衡二叉樹的特點是:每個節點的左右子樹高度差都不能超過 1。

這樣做有什麼好處呢?假設樹裡有 N 個節點,那麼樹的高度就能保持在 O(log n)。
自平衡二叉樹是在增刪二叉樹節點的時候,對樹結構進行調整,讓樹的高度始終保持平衡。
方法一:鏈表結構(最常見)
每個節點都有指向左右子節點的指針:
var TreeNode = function(x) {
    this.val = x;
    this.left = null;
    this.right = null;
}
// 構建一棵二叉樹:
var root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.right.left = new TreeNode(5);
root.right.right = new TreeNode(6);
// 構建出來的二叉樹是這樣的:
//     1
//    / \
//   2   3
//  /   / \
// 4   5   6
方法二:哈希表
其中鍵是父節點 id,值是子節點的 id 列表:
// 1 -> [2, 3]
// 2 -> [4]
// 3 -> [5, 6]
let tree = new Map([
    [1, [2, 3]],
    [2, [4]],
    [3, [5, 6]]
]);